﻿using System;
using System.Configuration;
using System.Data.Common;
using System.Linq;
using EOSCRM.Domain;
using EOSCRM.Util;
using System.Collections.Generic;


namespace EOSCRM.Dao
{
    public  class NhanVienDao:BaseDao
    {

        public NHANVIEN    Get(string ma)
        {
            return _db.NHANVIENs.SingleOrDefault(p => p.MaNV.Equals(ma));
        }

        public List<NHANVIEN> Search(string key,String macn)
        {
            var query = _db.NHANVIENs.AsQueryable();
            return query.Where(p => p.TenNV.ToUpper().Contains(key.ToUpper())
                || p.MaNV.ToUpper().Contains(key.ToUpper()))
                    .OrderBy(p => p.TenNV)
                    .ToList();
        }

        public List<NHANVIEN> GetList()
        {
            var list = _db.NHANVIENs.AsQueryable();
            return list.ToList();
        }
        /// <summary>
        /// lấy danh sách nhân viên theo lô cao sau và loại nhân viên
        /// </summary>
        /// <param name="malo"></param>
        /// <param name="loainv">01- công nhân 02- quản lý 03- giam dốc null all</param>
        /// <returns></returns>
        public List<NHANVIEN> GetList(String malo,String loainv)
        {
            var list = _db.NHANVIENs.AsQueryable();
            if (!String.IsNullOrEmpty(malo) && malo != "%")
            {
                list = list.Where(p =>(p.MaLo!=null && p.MaLo.Equals(malo))).AsQueryable();
            }
            if (!String.IsNullOrEmpty(loainv) && loainv != "%")
            {
                list = list.Where(p => p.LoaiNV.Equals(loainv)).AsQueryable();
            }
            return list.ToList();
        }
        public List<NHANVIEN> GetListLo(String malo)
        {
            return _db.NHANVIENs.Where(p =>(malo.Equals("%") || p.MaLo.Equals(malo))).OrderBy(p => p.MaNV).ToList();
        }

        public List<NHANVIEN> GetListLoNop(String malo, DateTime ngay)
        {
            return _db.NHANVIENs.Where(p => p.MaLo.Equals(malo) & !(p.CHAMCONGs.Any(cc=>cc.MaNV.Equals(p.MaNV) & cc.NgayChamCong.Equals(ngay.Date)))).OrderBy(p => p.MaNV).ToList();
        }

        public List<NHANVIEN> GetList(String MaNV, String tennv, String khuvuc, String congviec,String macn)
        {
            var query = _db.NHANVIENs.AsEnumerable();

            if (!String.IsNullOrEmpty(MaNV) && MaNV!="%")
                query = query.Where(nv => nv.MaNV.ToUpper().Contains(MaNV.ToUpper()));

            if (!String.IsNullOrEmpty(tennv))
                query = query.Where(nv => nv.TenNV.ToUpper().Contains(tennv.ToUpper()));
            return query.ToList();
        }
        public List<NHANVIEN> GetListByCV(string maCv,NHANVIEN nv)
        {
            return _db.NHANVIENs.Where(p => p.MaLo.Equals(nv.MaLo)).OrderBy(p => p.MaNV).ToList();
        }

        public int Count( )
        {
            return _db.NHANVIENs.Count();
        }

        public Message Insert(NHANVIEN objUi)
        {
            Message msg;
            try
            {

                _db.Connection.Open();
                _db.NHANVIENs.InsertOnSubmit(objUi);
                _db.SubmitChanges();

                // commit

                // success message
                msg = new Message(MessageConstants.I_CREATE_SUCCEED, MessageType.Info, "nhân viên");
            }
            catch (Exception ex)
            {
                // rollback transaction

                msg = ExceptionHandler.HandleInsertException(ex, "nhân viên");
            }
            return msg;
        }

        public Message Update(NHANVIEN objUi)
        {
            Message msg;
            try
            {
                // get current object in database
                var objDb = Get(objUi.MaNV  );

                if (objDb != null)
                {
                    objDb.TenNV = objUi.TenNV  ;
                    objDb.GioiTinh = objUi.GioiTinh;
                    objDb.NgaySinh = objUi.NgaySinh;
                    objDb.NgayVaoLam = objUi.NgayVaoLam;
                    objDb.DiaChi = objUi.DiaChi;
                    objDb.CMND = objUi.CMND;
                    objDb.LoaiNV = objUi.LoaiNV;
                    objDb.LoaiLuong = objUi.LoaiLuong;
                    objDb.MucLuong = objUi.MucLuong;
                    objDb.MaNVQuanLy = objUi.MaNVQuanLy;
                    objDb.MaLo = objUi.MaLo;
                    objDb.TinhTrang = objUi.TinhTrang;
                    objDb.NgayNghi = objUi.NgayNghi;
                      // Submit changes to db
                    _db.SubmitChanges();

                    // success message
                    msg = new Message(MessageConstants.I_UPDATE_SUCCEED, MessageType.Info, "nhân viên");
                }
                else
                {
                    // error message
                    msg = new Message(MessageConstants.E_OBJECT_IN_USED, MessageType.Error, "nhân viên");
                }
            }
            catch (Exception ex)
            {
                msg = ExceptionHandler.HandleUpdateException(ex, "Nhân viên ", objUi.TenNV    );
            }
            return msg;
        }

        public bool IsInUse(string ma)
        {
            //if (_db.THICONGs.Count(p => p.MaNV.Equals(ma)) > 0)
            //    return true;
            //if (_db.DONDANGKies.Count(p => p.MaNV.Equals(ma)) > 0)
            //    return true;
            return false;
            
        }

        public Message Delete(NHANVIEN objUi)
        {
            Message msg;

            try
            {
                // Get current Item in db
                var objDb = Get(objUi.MaNV );

                if (objDb == null)
                {
                    // error message
                    msg = new Message(MessageConstants.E_OBJECT_NOT_EXISTS, MessageType.Error, "Nhân viên ", objUi.MaNV );
                    return msg;
                }

                //TODO: check if "hồ sơ đất" is in use

                // Set delete info
                _db.NHANVIENs.DeleteOnSubmit(objDb);
                // Submit changes to db
                _db.SubmitChanges();

                // success message
                msg = new Message(MessageConstants.I_DELETE_SUCCEED, MessageType.Info, "Nhân viên ");
            }
            catch (Exception ex)
            {
                msg = ExceptionHandler.HandleDeleteException(ex, "Nhân viên ");
            }

            return msg;
        }

        

        /// <summary>
        /// Delete list
        /// </summary>
        /// <param name="objList"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public Message DeleteList(List<NHANVIEN> objList)
        {
            Message msg;
            DbTransaction trans = null;

            try
            {
                _db.Connection.Open();
                trans = _db.Connection.BeginTransaction();
                _db.Transaction = trans;

                foreach (var obj in objList)
                {
                    //TODO: check valid update infor
                    Delete(obj);
                }

                // commit
                trans.Commit();

                // success message
                msg = new Message(MessageConstants.I_DELETE_SUCCEED, MessageType.Info, "Nhân viên ");
            }
            catch (Exception ex)
            {
                // rollback transaction
                if (trans != null)
                    trans.Rollback();

                msg = ExceptionHandler.HandleInsertException(ex, "Danh sách nhân viên ");
            }

            return msg;
        }
    }
}
